package tech.edwardvan.java.methodreference;

import lombok.extern.slf4j.Slf4j;

/**
 * 方法引用
 * <p>
 * 引用构造函数。例如：Class::new
 * 引用静态方法。例如：Class::static_method
 * 引用特定对象的实例方法。例如：instance::method
 * 引用特定类型的任意对象的实例方法。例如：Class::method
 *
 * @author EdwardVan
 */
@Slf4j
public class MethodReferenceDemo {

    public static void main(String[] args) {
        // 接口实现类
        invoke(new SayHello());

        /* Lambda 表达式
         class 匿名类 implements Say {
            public void run() {
                log.info("Hello");
            }
        }
         */
        invoke(() -> log.info("Hello"));

        /*方法引用
        Say say = new SayHello();
        class 匿名类 implements Say {
            public void run() {
                say.run();
            }
        }
         */
        invoke(new SayHello()::run);

        /* 引用构造函数
        class 匿名类 implements Say {
            public void run() {
                new SayHello();
            }
        }
         */
        invoke(SayHello::new);
    }

    public static void invoke(Say say) {
        say.run();
    }

    private interface Say {
        void run();
    }

    @Slf4j
    private static class SayHello implements Say {

        public SayHello() {
            log.info("执行构造方法");
        }

        @Override
        public void run() {
            log.info("Hello");
        }
    }

}
